﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Hosting;
using System.Text;
using System.Xml;
using System.IO;
using System.Security.Cryptography;
using LCTMoodle.Service;
using LCTMoodle.Models.ViewModels;

namespace LCTMoodle.Helper
{
    public static class TienIch
    {
        /// <summary>
        /// Chèn các thẻ html hợp lý
        /// </summary>
        /// <param name="s">Chuỗi cần chuyển đổi</param>
        /// <returns></returns>
        public static string chuyenChuoiHtml(string s)
        {
            string chuoi;
            chuoi = "<p>";
            chuoi += s.Replace("\r\n", "</p><p>");
            chuoi += "</p>";

            System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"<p>\s*</p>");
            chuoi = regex.Replace(chuoi, "");

            regex = new System.Text.RegularExpressions.Regex(@"(http|ftp|https)://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?");
            //chuoi = regex.Replace(chuoi, "abcd");
            System.Text.RegularExpressions.MatchCollection mangLink = regex.Matches(chuoi);

            for (int i = mangLink.Count - 1; i >= 0; i--)
            {
                chuoi = chuoi.Insert(mangLink[i].Index + mangLink[i].Length, "</a>");
                chuoi = chuoi.Insert(mangLink[i].Index, "<a href=\"" + mangLink[i].Value + "\">");
            }

            return chuoi;
        }
        /// <summary>
        /// Hàm chuyển đổi các thẻ p thành ký hiệu xuống dòng
        /// </summary>
        /// <param name="s">Chuỗi cần chuyển đổi</param>
        /// <returns></returns>
        public static string xoaTheP(string s)
        {
            s = s.Remove(s.Length - 4, 4);
            s = s.Remove(0, 3);
            s = s.Replace("</p><p>", "\r\n");
            return s;
        }
        /// <summary>
        /// Lấy đường dẫn của tập tin
        /// </summary>
        /// <param name="fileName">Tên tập tin trong thư mục chứa</param>
        /// <returns></returns>
        public static string layTapTin(string fileName)
        {
            return TienIch.layDuongDan("~/Files/" + fileName);
        }
        /// <summary>
        /// Lưu tập tin
        /// </summary>
        /// <param name="file">Tập tin cần lưu</param>
        /// <param name="fileName">Tên tập tin lưu</param>
        public static void luuTapTin(HttpPostedFileBase file, string fileName)
        {
            file.SaveAs(TienIch.layDuongDan("~/Files/") + fileName);
        }
        /// <summary>
        /// Xóa tập tin
        /// </summary>
        /// <param name="fileName">Tên tập tin xóa</param>
        public static void xoaTapTin(string fileName)
        {
            File.Delete(TienIch.layDuongDan("~/Files/" + fileName));
        }
        /// <summary>
        /// Lấy giá trị của key trong file Data.xml
        /// </summary>
        /// <typeparam name="T">Kiểu dữ liệu cần chuyển đổi</typeparam>
        /// <param name="key">Tên key cần lấy</param>
        /// <returns></returns>
        public static T layXML_Data<T>(string key)
        {
            XmlDocument doc = new System.Xml.XmlDocument();
            doc.Load(HostingEnvironment.MapPath("~/App_Data/Data.xml"));
            return (T)Convert.ChangeType(doc.SelectSingleNode("/Data/" + key).InnerText, typeof(T));
        }
        /// <summary>
        /// Gán giá trị cho key truyền vào trong file Data.xml
        /// </summary>
        /// <param name="key">Tên key</param>
        /// <param name="value">Giá trị</param>
        public static void ganXML_Data(string key, string value)
        {
            string path = HostingEnvironment.MapPath("~/App_Data/Data.xml");
            XmlDocument doc = new System.Xml.XmlDocument();
            doc.Load(path);
            doc.SelectSingleNode("/Data/" + key).InnerText = value;
            doc.Save(path);
        }
        /// <summary>
        /// Lấy đường dẫn
        /// </summary>
        /// <param name="path">Đường dẫn</param>
        /// <returns></returns>
        public static string layDuongDan(string path)
        {
            return HostingEnvironment.MapPath(path);
        }

        /// <summary>
        /// Kiểm tra xem người dùng có quyền ... trong khóa học ... không - 0: OK - 1: Lỗi - 2: Không có quyền
        /// </summary>
        /// <param name="maKhoaHoc">Mã khóa học</param>
        /// <param name="maQuyen">Mã quyền</param>
        /// <returns>
        /// 0: OK -
        /// 1: Lấy quyền thất bại -
        /// 2: Không có quyền
        /// </returns>
        public static int kiemTraQuyenTrongKhoaHoc(int maKhoaHoc, string quyen)
        {
            Dictionary<int, string> danhSachQuyen = (Dictionary<int, string>)HttpContext.Current.Session["Quyen"];

            //Nếu đã tồn tại quyền => cập nhật
            if (danhSachQuyen.ContainsKey(maKhoaHoc))
            {
                danhSachQuyen[maKhoaHoc] = QuyenService.layQuyenTheoMaKhoaHocVaMaNguoiDung(maKhoaHoc, (HttpContext.Current.Session["NguoiDung"] != null) ? ((NguoiDungViewModel)HttpContext.Current.Session["NguoiDung"]).ma : -1);
            }
            //Nếu chưa => tạo mới
            else
            {
                danhSachQuyen.Add(maKhoaHoc, QuyenService.layQuyenTheoMaKhoaHocVaMaNguoiDung(maKhoaHoc, (HttpContext.Current.Session["NguoiDung"] != null) ? ((NguoiDungViewModel)HttpContext.Current.Session["NguoiDung"]).ma : -1));
            }

            //Nếu ko có quyền trong nhóm => false
            if (!danhSachQuyen.ContainsKey(maKhoaHoc))
            {
                return 1;
            }

            //Nếu không có quyền => false
            if (danhSachQuyen[maKhoaHoc].IndexOf("|" + quyen + "|") == -1)
            {
                return 2;
            }

            //OK
            return 3;
        }

        /// <summary>
        /// Kiểm tra xem người dùng đã đăng nhập chưa
        /// </summary>
        public static bool daDangNhap()
        {
            return HttpContext.Current.Session["NguoiDung"] != null;
        }

        /// <summary>
        /// MaHoaMD5
        /// </summary>
        /// <param name="md5Hash">Lớp MD5</param>
        /// <param name="strChuoiDauVao">Chuỗi muốn mã hoá</param>
        /// <returns>Chuỗi đã được mã hoá (hệ thập lục phân)</returns>
        public static string MaHoaMD5(MD5 md5Hash, string strChuoiDauVao)
        {
            //Khai báo biến chứa chuỗi đã mã hoá
            StringBuilder strChuoiKetQua = new StringBuilder();

            //Chuyển chuổi đầu vào thành một mảng byte
            byte[] mangByte = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(strChuoiDauVao));

            //Duyệt từng byte để thêm vào strChuoiKetQua với định dạng hệ thập lục phân
            for (int i = 0; i < mangByte.Length; i++)
            {
                strChuoiKetQua.Append(mangByte[i].ToString("x2"));
            }

            return strChuoiKetQua.ToString();
        }

        /// <summary>
        /// Kiểm tra mã hoá
        /// </summary>
        /// <param name="md5Hash">Đối tượng MD5</param>
        /// <param name="strChuoiDauVao">Chuỗi cần so sánh</param>
        /// <param name="strChuoiDaMaHoa">Chuỗi đã được mã hoá trước đó</param>
        /// <returns>true: Nếu 2 mã khùng khớp, false: Nếu 2 mã không trùng khớp</returns>
        public static bool  KiemTraMaHoa(MD5 md5Hash, string strChuoiDauVao, string strChuoiDaMaHoa)
        {
            //lấy chuỗi muốn kiểm tra, mã hoá và đưa vào biến strChuoiMaHoa
            string strChuoiMaHoa = MaHoaMD5(md5Hash, strChuoiDauVao);

            //Khởi tạo biến string để so sánh
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;

            if (comparer.Compare(strChuoiMaHoa, strChuoiDaMaHoa) == 0)
                return true;
            return false;
        }
    }
}